package com.tbit.uqbike.client.service;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * redis service
 *
 * @author Leon
 * 2017年2月24日 下午4:09:17
 */
public interface RedisService {
    /**
     * 添加
     *
     * @param key
     * @param value
     */
    void add(String key, String value);


    /**
     * 设置有效期
     *
     * @param key
     * @param value
     * @param seconds
     */
    void add(String key, String value, long seconds);

    void addMain(String key, String value, Integer seconds);


    /**
     * 获取
     *
     * @param key
     * @return
     */
    String get(String key);

    Long getAtomicLong(String key);

    /**
     * 获取
     *
     * @param key
     * @return
     */
    String getWay(String key);

    /**
     * 获取二级哈希
     *
     * @param hashId
     * @param key
     * @return
     */
    public String hash_get(String hashId, String key);

    /**
     * 获取二级哈希
     *
     * @param hashId
     * @param key
     * @return
     */
    public String getMain(String hashId, String key);

    /**
     * 获取一级哈希
     *
     * @param hashId
     * @return
     */
    public Map<String, String> hash_getAll(String hashId);

    /**
     * 删除
     *
     * @param key
     */
    public void del(String key);

    /**
     * @param key key
     * @return
     * @Description: 获取自增长值
     */
    public Long incr(String key, long liveTime);

    public String getSecondHash(String key, String field);

    /**
     * 分布式锁
     *
     * @param key
     * @param liveTime
     * @return
     */
    boolean setNx(String key, String value, long liveTime);

    /**
     * 缓存值为String序列化
     *
     * @param keyName 1
     * @param val     1
     */
    void lPushWithStr(String keyName, String val);

    /**
     * 获取list结构中的值
     * @param key
     * @param start
     * @param end
     * @return
     */
    List<String> lRangeWithStr(String key, Integer start, Integer end);

    /**
     * 缓存值为String序列化
     *
     * @param uKey 1
     * @return 1
     */
    String lPopWithStr(String uKey);

    /**
     * 移除列表中与参数 VALUE 相等的元素。 缓存值为String序列化
     *
     * @param faceQueue 队列
     * @param val       值
     */
    void lRemWithStr(String faceQueue, String val);

    /**
     * 获取redis key的过期时间
     * @return long
     */
    Long getExpiration(String key);

    /**
     * 哈希字段自增
     * @param key 实体 - key
     * @param filed 属性 - key
     * @param delta 增量
     * @return
     */
    boolean hash_incr(String key, String filed, Long delta);

    /**
     * 哈希对象 field:value 集合
     * @param key
     * @return
     */
    Map<String,String> getHashEntries(String key);

    /**
     * 获取所有匹配的key
     * todo 生产环境谨慎使用，会扫描所有key 逐一匹配，阻塞Redis主线程
     * @param keyPattern key 通配符
     * @return
     */
    @Deprecated
    Set<String> keys(String keyPattern);

    /**
     * 设置hash值
     * @param key
     * @param filed
     * @param value
     */
    void setHashFiled(String key,String filed,String value);


    void incr(String key);

    String getWithStr(String key);

    /**
     * redis set 结构添加元素
     * @param key
     * @param values
     */
    void addSet(String key, Date expireDate, String... values);

    /**
     * redis set 结构判断 set中是否存在value
     * @param key
     * @param value
     * @return
     */
    boolean hasElementSet(String key,String value);

    /**
     * 判断Redis中是否存在key
     * @param key 缓存键
     * @return true 存在 / 不存在
     */
    boolean hasKey(String key);
}